
/*
 * 基于 express 来实优化 石头剪刀布 的游戏
 * 
 * express 优点：
 * 1、路由功能（和 http 不同，不用写在一个 http.create 下）
 *   - 更细致一点的话，路由的分发，可以在不同模块中去实现
 * 2、http 功能封装与简化
 *   - request 简化
 *      - 省去调用 url 与 querystring 库，直接使用 pathname，query
 *   - response 简化
 *      - send() 用来替换 end() 或 直接输出内容
 *      - status() 用来替换 writeHead() + 空的 end()
 *      - json()、jsonp()等
 * 3、中间件：next() 洋葱模型
 *   - 对一段操作进行分层，利用 next() 连接，
 *   - 中间件有异步操作的话，next() 并不会等待异步执行完毕，因此中间件中不能有异步事件（也就是一个缺点，不能处理异步）(利用 koa 解决)
 *   - next() 是有返回的，next() 后面的语句 会在后面的中间件执行完毕再执行（可以了解为 next 为一个模块的引用）
 */
const express = require('express')
const fs = require('fs')
const game = require('../commonJS/gameLib')

const app = express()

// 玩家胜率次数，如果超过 3，则后续服务器的请求都返回 500
var playWinCount = 0
// 玩家上一次游戏动作
var lastPlayAction = null
// 玩家连续出同一动作的次数，如果超过 3 次
var sameCount = 0

// ico
app.get('/favicon.ico', function(req, res) {
    res.status(200)
})

// 根路径页面请求
app.get('/', function(req, res) {
    // 不写 utf-8 编码的话，就默认为下载了
    res.send(fs.readFileSync(__dirname + '/game.html', 'utf-8'))
})

// 游戏逻辑：分为 3 个中间件，更加清晰
app.get('/game', 
    // logci 1：连赢 3 次 或是触发了 3 次出同样的操作
    function(req, res, next) {
        if (playWinCount >= 3 || sameCount == 99) {
            res.status(500)
            res.send('你耍赖，我再也不和你玩了~~~')
            return
        }
        next()
        // 这个逻辑会在下面有结果之后执行
        if (res.playerWon) {
            playWinCount++
        }
    },
    // logci 2：连续 3 次出同一个操作
    function(req, res, next) {
        const query = req.query
        const playAction = query.action
        if (lastPlayAction && lastPlayAction == playAction) {
            sameCount++
        }else {
            sameCount = 0
        }
        lastPlayAction = playAction
        if (sameCount >= 3) {
            res.status(400)
            res.send('没意思，不许出一样的~~~')
            sameCount = 99
            return;
        }
        res.playAction = playAction
        next()
    },
    // 在这里处理正常逻辑 
    function(req, res) {  
        const playAction = res.playAction
        const gameResult = game(playAction)
        res.status(200)
        if (gameResult == 0) {
            res.send('平局！')
        }else if (gameResult == -1) {
            res.playerWon = true
            res.send('你赢了！')
        }else {
            res.send('你输了！')
        }
    }
)

app.listen(3000)